//
//  MemoryManagementView.swift
//  swiftStudy
//
//  Created by ext.zhangjunfei on 2021/7/26.
//

import SwiftUI

struct MemoryManagementView: View {
    
    let code_1:String
    let code_2:String
    let code_3:String
    
    
    init() {
        code_1 =
            """
            //创建一个函数
            func test(){
                //变量a的作用域为整个函数内，函数调用过后，a将被销毁
                var a = 10
                
                while a > 0 {
                    a -= 1
                    //常量b的作用域在while循环块内，循环退出b将被销毁
                    let b = 2
                    print(b)
                }
                
                if a < 0 {
                    //c的作用域为if语句块内，if语句结束后，变量c将销毁
                    let c = 10
                    print(c)
                }
            }

            //创建一个类
            class TestClass{
                //name属性与当前类的实例关联，其生命周期与当前类实例一致
                var name:String = "hello,world"
            }

            //创建实例的时候，其属性也会被构造，并为其分配你内存空间
            var testClass:TestClass? = TestClass()
            //实例被销毁，其属性也随同一起销毁，释放所占的内存空间
            testClass = nil
            """
        
        code_2 =
            """
            //定义异常
            enum MyErr : Error{
                case DesTroyError
                case NormalError
                case SimpleError
            }

            //定义一个抛出异常的方法
            func test(param:Bool)throws->Void{
                if param {
                    throw MyErr.NormalError
                }
            }

            //使用do-catch进行异常的捕获和处理
            do{
                
                try test(param: true)
                
            } catch MyErr.NormalError{
                print("NormalError")
            } catch MyErr.DesTroyError{
                print("DesTroyError")
            } catch MyErr.SimpleError{
                print("SimpleError")
            }
            """
        code_3 =
            """
            //定义异常
            enum MyErr : Error{
                case DesTroyError
                case NormalError
                case SimpleError
            }

            //定义一个抛出异常的方法
            func test(param:Bool)throws->Void{
                if param {
                    throw MyErr.NormalError
                }
            }

            //使用try?处理异常
            var err: Void? = try? test(param: true)

            if err == nil {
                print("发生异常")
            }else{
                print("未发生异常")
            }

            //结合if-let语句可写出十分飘逸的异常处理代码
            if let _ = try? test(param: true){
                print("执行成功")
            }else{
                print("发生异常")
            }
            """
    }
    
    var body: some View {
        ScrollView{
            LazyVStack(alignment: HorizontalAlignment.leading, spacing: 10) {
                Section(header: SectionHeaderView(title: "内存概述")) {
                    CommonTextView(content: "在软件开发过程中，开发者创建的任意一个变量，一个常量等等，都在内存中占有一定的空间，如果不对内存空间进行合理的管理，随着软件运行时间的增加，最终将因内存不足而造成灾难性的后果。")
                    CommonTextView(content: "Swift采用引用计数的方式来管理实例与内存空间。自动引用计数是O-C与Swift语言中解决内存管理问题的一种手段。")
                    CommonTextView(content: "在Swift语言中。任何变量和常量都有作用域，普通变量和常量的作用域往往只在离其最近的大括号内。属性则特殊一些，其和具体的实例关联，和实例的生命周期保持一致。")
                    
                    CodeView(code: code_1).padding(10)
                }
                Section(header: SectionHeaderView(title: "异常的抛出和传递")) {
                    CommonTextView(content: "程序代码的运行很多时候并不会按照我们的设想进行，编写代码时进行可控的异常处理是非常必要的。在Swift语言中所有的异常和错误都由Error协议来指定。")
                    CommonTextView(content: "如果抛出了异常而不处理，程序就会在异常抛出的地方中断。do-catch结构是Swift语言中处理异常最常用的方法。如下：")
                    CodeView(code: code_2).padding(10)
                    CommonTextView(content: "有些时候开发者可能并不关心产生异常的类型与原因，这时候可以把异常映射为Optional值。如下：")
                    CodeView(code: code_3).padding(10)
                    
                }
            }
        }
    }
}

struct MemoryManagementView_Previews: PreviewProvider {
    static var previews: some View {
        MemoryManagementView()
    }
}
